<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/7/6
 * Time: 16:49
 * @author: yfl
 * @QQ: 554665488
 * @description:
 * @time:
 */

namespace app\oa\controller;


use think\Controller;
use think\Log;
use think\Request;

/**
 * @author: yfl
 * @QQ: 554665488
 * @description:  OA 控制器基类
 * @time: 2017年7月6日 16:50:14
 * Class BaseController
 * @package app\oa\controller
 */
class BaseController extends Controller
{
    const VERSIONS = 1.0;
    protected $error;             //出错时候的记录
    protected $log = [];            //要保存的记录
    static protected $saveLog = false;
    static protected $a = 0;
    protected $title;  //页面动态title
    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:
     * @time:
     * @var array
     */
    static public $return_code = [
        '1' => '操作成功',
        '1002' => '你想做什么呢', //非法的请求方式 非ajax
        '1003' => '请求参数错误', //如参数不完整,类型不正确
        '1004' => '请先登陆再访问', //未登录 或者 未授权
        '1005' => '请求授权不符', ////非法的请求  无授权查看
        '1006' => '数据加载失败', //
        '1010' => '数据不存在', //
        '1020' => '验证码输入不正确', //
        '1021' => '用户账号或密码错误', //
        '1022' => '用户账号被禁用', //
        '1030' => '数据操作失败', //
        '404' => '请求异常'
    ];

    public function __construct(Request $request = null)
    {
        parent::__construct($request);
        $this->setTitle();
        if (empty(getSession('mobile'))) {
            $this->redirect('/login');
        }
    }

    /**
     * @param Request $request
     * @description 空操作
     */
    public function _empty(Request $request)
    {
        $this->fetch($request->action());
    }
//    abstract protected function say();
    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  返回错误信息
     * @time:
     * @param string $code 错误状态码
     * @param array $data 返回的数据
     * @param string $msg 返回的消息
     * @return array
     */
    final static protected function showReturnCode($code = '', $msg = '', $data = [])
    {
        $return_data = [
            'code' => '500',
            'msg' => '未定义消息',
//            'data' => $code == 1001 ? $data : [],
            'data' => $data,
        ];
        if (empty($code)) return $return_data;
        $return_data['code'] = $code;
        if (!empty($msg)) {
            $return_data['msg'] = $msg;
        } else if (isset(self::$return_code[$code])) {
            $return_data['msg'] = self::$return_code[$code];
        }
        return $return_data;
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  返回消息
     * @time:
     * @param string $code 错误状态码
     * @param string $msg 返回的消息
     * @param array $data 返回的数据
     * @param array $header 返回的头部消息
     * @param array $options 返回的参数
     * @return array
     */
    final static protected function showReturnCodeWithOutData($code = '', $msg = '', $data = [], $header = [], $options = [])
    {
        return json(static::showReturnCode($code, $msg, $data), $code = 200, $header, $options);
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  返回消息并且写入日志
     * @time:
     * @param string $code 错误状态码
     * @param array $data 返回的数据
     * @param string $msg 返回的消息
     * @param string $level 日志级别
     * @return array
     */
    final protected function showReturnCodeWithSaveLog($code = '', $msg = '', $data = [], $level = 'log')
    {
        static::$saveLog = true;
        $this->addLog($code, $msg, $data, $level);  //写入日志
        return json(self::showReturnCode($code, $msg, $data), $code = 200, $header = [], $options = []);//返回数据
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  组装日志信息
     * @time:
     * @param string $code 错误状态码
     * @param string $msg 记录自定义消息
     * @param array $data 记录的错误数据
     * @param string $level 日志级别  log 常规日志，用于记录日志 ; error 错误，一般会导致程序的终止 ; notice 警告，程序可以运行但是还不够完美的错误;
     * info 信息，程序输出信息 ; debug 调试，用于调试信息 ; sql SQL语句，用于SQL记录，只在数据库的调试模式开启时有效;
     */
    final protected function addLog($code = '', $msg = '', $data = [], $level = 'log')
    {
        $this->log[] = [
//            'uuid' => $this->uuid,
            'url' => $this->request->url(true),
            'method' => $this->request->method(),
            'request_data' => $this->getData(),
            'ip' => $this->request->ip(),
            'code' => $code,
            'msg' => $msg,
            'level' => $level,
            'data' => $data
        ];
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  获取请求的数据
     * @time: 2017年6月30日 09:06:17
     * @return mixed array
     */
    final protected function getData()
    {
        if ($this->request->isPost()) {
            return $this->request->post();
        } else {
            return $this->request->get();
        }
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  写入日志  待修改
     * @time: 2017年6月30日 09:18:51
     */
    final protected function saveLogAction()
    {
        if (!empty($this->log)) {
            foreach ($this->log as $value) {
                Log::$value['level']($value);
            }
        }
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:直接写入日志
     * @time: 2017年6月30日 09:21:38
     * @param string $code 错误状态码
     * @param array $data 记录的错误数据
     * @param string $msg 记录自定义消息
     * @param string $level 日志级别
     */
    final protected function toSaveLog($code = '', $msg = '', $data = [], $level = 'log')
    {
        static::$saveLog = true;
        $this->addLog($code, $msg, $data, $level);
    }

    /**
     * @author: yfl
     * @QQ: 554665488
     * @description:  构造页面title
     * @time:2017年7月10日 10:00:12
     */
    final private function setTitle()
    {
        $this->title=isset($this->title)?$this->title:'OA办公';
        $this->assign('title', $this->title);
    }

    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        //记录日志

        if (!empty($this->log) && static::$saveLog == true) {
            $this->saveLogAction();
        }
    }

}